package pe.edu.upc.dsd.l33t.jms;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import pe.edu.upc.dsd.l33t.model.Pago;
import pe.edu.upc.dsd.l33t.model.PagoResponse;

import com.google.gson.Gson;

public class PagoJmsServer implements MessageListener {

	private Logger logger = Logger.getLogger(PagoJmsServer.class);

	private JmsTemplate jmsTemplate;
	private String responseDestination;
	
	@Override
	public void onMessage(Message message) {

		if (message instanceof TextMessage) {
			final TextMessage requestMessage = (TextMessage) message;
			try {
				final String mensaje = requestMessage.getText();
				
				logger.debug("PagoJmsServer id " + requestMessage.getJMSCorrelationID() +  " recibiendo: " + mensaje);
				
				// Deserializar mensaje JSON y procesar la data 
				Gson gson = new Gson();
				Pago pago = gson.fromJson(mensaje, Pago.class);

				// TODO: SIMULAR PAGO.
				logger.debug("Pago monto: " + pago.getTotal());

				// Responder
				PagoResponse pagoResponse = new PagoResponse();
				pagoResponse.setEsCorrecto(true);
				pagoResponse.setCodigoError("0000");
				pagoResponse.setMensaje("");
				pagoResponse.setNumeroTransaccion(requestMessage.getJMSCorrelationID());
				
				final String respuesta = gson.toJson(pagoResponse);
				
				jmsTemplate.send(responseDestination, new MessageCreator() {
					@Override
					public Message createMessage(Session session)
							throws JMSException {
						TextMessage responseMessage = session
								.createTextMessage();
						responseMessage.setJMSCorrelationID(requestMessage
								.getJMSCorrelationID());
						responseMessage.setText(respuesta);
						return responseMessage;
					}
				});
			} catch (final JMSException e) {
				logger.error("Error al procesar el mensaje JMS", e);
			}
		}
		
	}
	
	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}

	public void setResponseDestination(String responseDestination) {
		this.responseDestination = responseDestination;
	}
}
